package com.sunny.design.adapter.login;

import com.sunny.design.adapter.ResultMsg;

/**
 * 适配器模式
 *  适配器模式主要解决的是功能兼容问题
 *
 * 优点：
     * 1、能提高类的透明性和复用，现有的类复用但不需要改变。
     * 2、目标类和适配器类解耦，提高程序的扩展性。
     * 3、在很多业务场景中符合开闭原则。
 *
 * 缺点：
     * 1、适配器编写过程需要全面考虑，可能会增加系统的复杂性。
     * 2、增加代码阅读难度，降低代码可读性，过多使用适配器会使系统代码变得凌乱。
 *
 *  遵循开闭原则的前提下，完整地实现了一个兼容多平台登录的业务场景。
 *
 * @author Sunny
 * @date 2020/1/11 17:38
 */
public class PassportForThirdAdapter extends SignInService implements IPassportForThird {

    @Override
    public ResultMsg loginForQQ(String openId) {
        return process(openId, LoginForQQAdapter.class);
    }

    @Override
    public ResultMsg loginForWeChat(String openId) {
        return process(openId, LoginForWechatAdapter.class);
    }

    @Override
    public ResultMsg loginForToken(String token) {
        return process(token, LoginForTokenAdapter.class);
    }

    @Override
    public ResultMsg loginForTelephony(String telephony, String code) {
        return process(telephony, LoginForTelephonyAdapter.class);
    }

    @Override
    public ResultMsg loginForRegister(String username, String passport) {
        super.register(username, passport);
        return super.login(username, passport);
    }

    /**
     * 利用简单工厂与及策略模式执行登录
     *
     * @param key 账号
     * @param clazz 执行器
     */
    public ResultMsg process(String key, Class<? extends LoginAdapter> clazz) {
        try {
            LoginAdapter adapter = clazz.newInstance();
            if (adapter.supports(adapter)) {
                return adapter.login(key, adapter);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
